package com.netease.nim.demo.util;

import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.TimeZone;

public class TimeUtil {

	public static boolean isEarly(int days, long time) {
		return (currentTimeMillis() - time) > (days * 24 * 3600 * 1000);
	}

	public static int currentTimeSecond() {
		return (int) (System.currentTimeMillis() / 1000);
	}

	public static long currentTimeMillis() {
		return System.currentTimeMillis();
	}

	public static long[] getTsTimes() {
		long[] times = new long[2];

		Calendar calendar = Calendar.getInstance();

		times[0] = calendar.getTimeInMillis() / 1000;

		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);

		times[1] = calendar.getTimeInMillis() / 1000;

		return times;
	}

	public static String getNowDatetime() {
		SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
		return (formatter.format(new Date()));
	}

	public static int getNow() {
		return (int) ((new Date()).getTime() / 1000);
	}
	
	public static String getNowDateTime(String format) {
		Date date = new Date();

		SimpleDateFormat df = new SimpleDateFormat(format, Locale.getDefault());
		return df.format(date);
	}

	public static String getDateString(long milliseconds) {
		return getDateTimeString(milliseconds, "yyyyMMdd");
	}

	public static String getTimeString(long milliseconds) {
		return getDateTimeString(milliseconds, "HHmmss");
	}
	
	public static String getBeijingNowTimeString(String format) {
		TimeZone timezone = TimeZone.getTimeZone("Asia/Shanghai");

		Date date = new Date(currentTimeMillis());
		SimpleDateFormat formatter = new SimpleDateFormat(format, Locale.getDefault());
		formatter.setTimeZone(timezone);

		GregorianCalendar gregorianCalendar = new GregorianCalendar();
		gregorianCalendar.setTimeZone(timezone);
		String prefix = gregorianCalendar.get(Calendar.AM_PM) == Calendar.AM ? "上午": "下午";

		return prefix + formatter.format(date);
	}

	public static String getBeijingNowTime(String format) {
		TimeZone timezone = TimeZone.getTimeZone("Asia/Shanghai");

		Date date = new Date(currentTimeMillis());
		SimpleDateFormat formatter = new SimpleDateFormat(format, Locale.getDefault());
		formatter.setTimeZone(timezone);

		return formatter.format(date);
	}

	public static String getDateTimeString(long milliseconds, String format) {
		Date date = new Date(milliseconds);
		SimpleDateFormat formatter = new SimpleDateFormat(format, Locale.getDefault());
		return formatter.format(date);
	}


	public static String getFavoriteCollectTime(long milliseconds) {
		String showDataString = "";
		Date today = new Date();
		Date date = new Date(milliseconds);
		Date firstDateThisYear = new Date(today.getYear(), 0, 0);
		if (!date.before(firstDateThisYear)) {
			SimpleDateFormat dateformatter = new SimpleDateFormat("MM-dd", Locale.getDefault());
			showDataString = dateformatter.format(date);
		} else {
			SimpleDateFormat dateformatter = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
			showDataString = dateformatter.format(date);
		}
		return showDataString;
	}

	public static String getTimeShowString(long milliseconds, boolean abbreviate) {
		String dataString = "";
		String timeStringBy24 = "";

		Date currentTime = new Date(milliseconds);
		Date today = new Date();
		Calendar todayStart = Calendar.getInstance();
		todayStart.set(Calendar.HOUR_OF_DAY, 0);
		todayStart.set(Calendar.MINUTE, 0);
		todayStart.set(Calendar.SECOND, 0);
		todayStart.set(Calendar.MILLISECOND, 0);
		Date todaybegin = todayStart.getTime();
		Date yesterdaybegin = new Date(todaybegin.getTime() - 3600 * 24 * 1000);
		Date preyesterday = new Date(yesterdaybegin.getTime() - 3600 * 24 * 1000);

		if (!currentTime.before(todaybegin)) {
			dataString = "今天";
		} else if (!currentTime.before(yesterdaybegin)) {
			dataString = "昨天";
		} else if (!currentTime.before(preyesterday)) {
			dataString = "前天";
		} else if (isSameWeekDates(currentTime, today)) {
			dataString = getWeekOfDate(currentTime);
		} else {
			SimpleDateFormat dateformatter = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
			dataString = dateformatter.format(currentTime);
		}

		SimpleDateFormat timeformatter24 = new SimpleDateFormat("HH:mm", Locale.getDefault());
		timeStringBy24 = timeformatter24.format(currentTime);

		if (abbreviate) {
			if (!currentTime.before(todaybegin)) {
				return getTodayTimeBucket(currentTime);
			} else {
				return dataString;
			}
		} else {
			return dataString + " " + timeStringBy24;
		}
	}

	/**
	 * 根据不同时间段，显示不同时间
	 * 
	 * @param date
	 * @return
	 */
	public static String getTodayTimeBucket(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		SimpleDateFormat timeformatter0to11 = new SimpleDateFormat("KK:mm", Locale.getDefault());
		SimpleDateFormat timeformatter1to12 = new SimpleDateFormat("hh:mm", Locale.getDefault());
		int hour = calendar.get(Calendar.HOUR_OF_DAY);
		if (hour >= 0 && hour < 5) {
			return "凌晨 " + timeformatter0to11.format(date);
		} else if (hour >= 5 && hour < 12) {
			return "上午 " + timeformatter0to11.format(date);
		} else if (hour >= 12 && hour < 18) {
			return "下午 " + timeformatter1to12.format(date);
		} else if (hour >= 18 && hour < 24) {
			return "晚上 " + timeformatter1to12.format(date);
		}
		return "";
	}

	/**
	 * 根据日期获得星期
	 * 
	 * @param date
	 * @return
	 */
	public static String getWeekOfDate(Date date) {
		String[] weekDaysName = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
		// String[] weekDaysCode = { "0", "1", "2", "3", "4", "5", "6" };
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int intWeek = calendar.get(Calendar.DAY_OF_WEEK) - 1;
		return weekDaysName[intWeek];
	}

    public static boolean isSameDay(long time1,long time2){
        return isSameDay(new Date(time1),new Date(time2));
    }

	public static boolean isSameDay(Date date1, Date date2) {
		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		cal1.setTime(date1);
		cal2.setTime(date2);
		
		boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
		                  cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);		
		return sameDay;
	}
	
	/**
	 * 判断两个日期是否在同一周
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameWeekDates(Date date1, Date date2) {
		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		cal1.setTime(date1);
		cal2.setTime(date2);
		int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR);
		if (0 == subYear) {
			if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
				return true;
		} else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) {
			// 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周
			if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
				return true;
		} else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) {
			if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR))
				return true;
		}
		return false;
	}

	public static long getSecondsByMilliseconds(long milliseconds) {
		long seconds = new BigDecimal((float) ((float) milliseconds / (float) 1000)).setScale(0,
				BigDecimal.ROUND_HALF_UP).intValue();
		// if (seconds == 0) {
		// seconds = 1;
		// }
		return seconds;
	}

	public static String secToTime(int time) {
		String timeStr = null;
		int hour = 0;
		int minute = 0;
		int second = 0;
		if (time <= 0)
			return "00:00";
		else {
			minute = time / 60;
			if (minute < 60) {
				second = time % 60;
				timeStr = unitFormat(minute) + ":" + unitFormat(second);
			} else {
				hour = minute / 60;
				if (hour > 99)
					return "99:59:59";
				minute = minute % 60;
				second = time - hour * 3600 - minute * 60;
				timeStr = unitFormat(hour) + ":" + unitFormat(minute) + ":" + unitFormat(second);
			}
		}
		return timeStr;
	}

	public static String unitFormat(int i) {
		String retStr = null;
		if (i >= 0 && i < 10)
			retStr = "0" + Integer.toString(i);
		else retStr = "" + i;
		return retStr;
	}

	public static String getElapseTimeForShow(int milliseconds) {
		StringBuilder sb = new StringBuilder();
		int seconds = milliseconds / 1000;
		if (seconds < 1)
			seconds = 1;
		int hour = seconds / (60 * 60);
		if (hour != 0) {
			sb.append(hour).append("小时");
		}
		int minute = (seconds - 60 * 60 * hour) / 60;
		if (minute != 0) {
			sb.append(minute).append("分");
		}
		int second = (seconds - 60 * 60 * hour - 60 * minute);
		if (second != 0) {
			sb.append(second).append("秒");
		}
		return sb.toString();
	}
}
